#include "form.h"
#include "login_widget.h"
#include "ui_form.h"
#include "attend.h"
#include <QMessageBox>

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);

    // 实例化QTcpSocket对象
    socket = new QTcpSocket();

    // 初始阶段
    stage = 0;

    setWindowTitle("打卡");

    // 加载图片资源
    QPixmap pix;
    pix.load("E:/QRS/QT/qt_code/xust_displayImg/img/2.jpg");
    ui->display_label->setScaledContents(true);  // 给标签设置内容自适应
    ui->display_label->setPixmap(pix);           // 将像素图设置到标签上

    // 初始将开始按钮设置成可以点击，停止按钮不能点击
    ui->start_button->setEnabled(true);
    ui->stop_button->setEnabled(false);

    //信号关联到槽函数
    connect(socket,SIGNAL(connected()),this,SLOT(connect_ok()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnect_ok()));
    connect(socket,SIGNAL(readyRead()),this,SLOT(read_data()));
    connect(socket,SIGNAL(disconnect()),this,SLOT(disconnect()));

    at = new attend;
    connect(at,SIGNAL(returnPressedAt()),this,SLOT(show()));
}

Form::~Form()
{
    delete ui;
}

void Form::connect_ok()
{
    // 初始将开始和返回按钮设置成不可以点击，停止按钮能点击
    ui->start_button->setEnabled(false);
    ui->stop_button->setEnabled(true);
    ui->return_button->setEnabled(false);
    // 阶段1代表可以开始接收图像数据长度协议头数据
    stage=1;
}

void Form::disconnect_ok()
{
    // 初始将开始和返回按钮设置成可以点击，停止按钮不能点击
    ui->start_button->setEnabled(true);
    ui->stop_button->setEnabled(false);
    ui->return_button->setEnabled(true);
}

int g_image_size;
char g_image[300000];

void Form::read_data()
{
    char buf[64]={0};
    // 处于阶段1才能开始接收协议头数据
    if(stage == 1)
    {
        // 协议头是7个字节
        if(socket->bytesAvailable() < 7)
        {
            return;
        }
        // 读取协议头数据
        socket->read(buf, 7);
        QString head = buf;
        QStringList list = head.split("#");
        int sz = list[0].size();
        if (list[0][sz - 1] == '$') {
            g_image_size = list[0].left(sz - 1).toUInt();
            stage = 3;
        } else {
            g_image_size = list[0].toUInt();
            // 阶段2代表可以开始接收图像数据
            stage = 2;
        }

    }

    // 处于阶段2才能开始接收图像数据
    if(stage == 2)
    {
        if(socket->bytesAvailable()<g_image_size)
        {
            return;
        }
        // 读图像数据
        socket->read(g_image,g_image_size);

            // 将图像设置到标签上
            QPixmap pix;
            pix.loadFromData((const uchar*)g_image,g_image_size);
            ui->display_label->setPixmap(pix);

            // 阶段1表示可以开始接收协议头数据
            stage = 1;
    }
    if (stage == 3) {
//        QMessageBox::information(this, "打卡成功", "马启智", QMessageBox::Ok);
        if (socket ->bytesAvailable() < g_image_size) {
            return;
        }
        //QMessageBox::information(this, "打卡成功", "马启智", QMessageBox::Ok);
        socket->read(g_image,g_image_size);
        // 将 g_image 转换为 QByteArray
        QByteArray byteArray(g_image, g_image_size);

        // 将 QByteArray 转换为 QString
        QString g_image_string = QString::fromLatin1(byteArray);
        if (g_image_string == "wsj") {  //userId = 1
            ui->ip_edit->clear();
            ui->port_edit->clear();
            // 加载图片资源
            QPixmap pix;
            pix.load("E:/QRS/QT/qt_code/xust_displayImg/img/2.jpg");
            ui->display_label->setScaledContents(true);  // 给标签设置内容自适应
            ui->display_label->setPixmap(pix);           // 将像素图设置到标签上

            at->show();

        }
    }
}

void Form::on_start_button_clicked()
{
    // 获取IP地址
    QString ip = ui->ip_edit->text();
    if(ip.isEmpty())
    {
        QMessageBox::warning(this,"警告","IP地址不能为空!");
        return;
    }

    // 获取端口号
    QString port = ui->port_edit->text();
    if(port.isEmpty())
    {
        QMessageBox::warning(this,"警告","端口号不能为空!");
        return;
    }

    // 连接服务器
    socket->connectToHost(ip,port.toUInt());

}

void Form::on_stop_button_clicked()
{
    // 断开与服务器的连接
    socket->disconnectFromHost();

    QPixmap pix;
    pix.load("E:/QRS/QT/qt_code/xust_displayImg/img/2.jpg");
    ui->display_label->setScaledContents(true);  // 给标签设置内容自适应
    ui->display_label->setPixmap(pix);           // 将像素图设置到标签上
}

void Form::on_return_button_clicked()
{
    // 关闭当前窗口
    ui->ip_edit->clear();
    ui->port_edit->clear();
    this->close();
    // 给登录窗口发送自定义信号，登录窗口收到信号后在关联的槽函数里将自己显示出来
    // 信号触发方法：emit 信号();
    emit returnPressed();
}

void Form::readData()
{
    //获取文本内容
    QString text = socket->readAll();
    //发送文本内容
    socket->write(text.toStdString().c_str());
}




